package es.webapp.exiquets.web;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import es.webapp.exiquets.domain.entities.Producto;
import es.webapp.exiquets.domain.entities.User;
import es.webapp.exiquets.domain.entities.Usuariosanonimo;
import es.webapp.exiquets.domain.webforms.ProductoForm;
import es.webapp.exiquets.domain.webforms.ProductosForm;
import es.webapp.exiquets.domain.webforms.UsuarioWeb;
import es.webapp.exiquets.service.GestorProductos;
import es.webapp.exiquets.service.GestorUsuarios;
import es.webapp.exiquets.utils.UserSessionHelper;
import es.webapp.exiquets.utils.eXiquetsConstants;
 
@Controller
@RequestMapping(value="/carrito/*")
public class GestorCarritoController {
	
	@Autowired
	GestorProductos gestorProductos;
	
	@Autowired
	GestorUsuarios gestorUsuarios;
	
	@RequestMapping(value="/carrito/deleteProducto", method=RequestMethod.GET)
	public ModelAndView eliminarProductoCarrito(@RequestParam Map<String,String> allRequestParams, ModelMap model){
		ModelAndView vista = new ModelAndView("redirect:/carrito/addProductos");
		
		int idProducto = 0;
		try{
			idProducto = Integer.parseInt(allRequestParams.get("idProductos"));
		}catch (NumberFormatException e){
			
		}
		
		UsuarioWeb usuarioWeb = UserSessionHelper.getUserSession();
		
		if(eXiquetsConstants.USUARIO_TIPO_ANONIMO.equalsIgnoreCase(usuarioWeb.getTipoUsuario())){
			Usuariosanonimo usuario = usuarioWeb.getUsuarioAnonimo();
			Producto productoEliminado = null;
			for(Producto p : usuario.getProductos()){
				if(p.getIdProductos() == idProducto){
					productoEliminado = p;
					break;
				}
			}
			if(productoEliminado != null){
				productoEliminado.getUsuariosanonimos().remove(usuario);
				gestorProductos.updateProductos(productoEliminado);
//				usuario.getProductos().remove(productoEliminado);
//				gestorUsuarios.updateUsuarioAnonimo(usuario);
			}
		}else{
			User usuario = usuarioWeb.getUsuarioRegistrado(); 
			Producto productoEliminado = null;
			for(Producto p : usuario.getProductos()){
				if(p.getIdProductos() == idProducto){
					productoEliminado = p;
					break;
				}
			}
			if(productoEliminado != null){
				productoEliminado.getUsers().remove(usuario);
				gestorProductos.updateProductos(productoEliminado);
//				usuario.getProductos().remove(productoEliminado);
//				gestorUsuarios.updateUsuario(usuario);
			}
		}
		
		return vista;
	}
	
	
	@RequestMapping(value="/carrito/addProductos",method = RequestMethod.GET)
	public ModelAndView listarProductos(ModelMap model) {
		
		List<ProductoForm> productos = new ArrayList<ProductoForm>();
		ModelAndView vista = null;
		
		UsuarioWeb usuarioWeb = UserSessionHelper.getUserSession();
		
		if(eXiquetsConstants.USUARIO_TIPO_ANONIMO.equalsIgnoreCase(usuarioWeb.getTipoUsuario())){
		    Usuariosanonimo usuario = usuarioWeb.getUsuarioAnonimo();
			for(Producto p : gestorProductos.getProductos()){
				ProductoForm productoVista = new ProductoForm(p);
				productos.add(productoVista);
			}
			ProductosForm listaProductos = new ProductosForm(productos);
			vista = new ModelAndView("carrito/cestaCompra","listaProductos",listaProductos);
			vista.addObject("productosUsuario", usuario.getProductos());
		}else{
			User usuario = usuarioWeb.getUsuarioRegistrado(); 
			
			for(Producto p : gestorProductos.getProductos()){
				ProductoForm productoVista = new ProductoForm(p);
				productos.add(productoVista);
			}
			ProductosForm listaProductos = new ProductosForm(productos);
			vista = new ModelAndView("carrito/cestaCompra","listaProductos",listaProductos);
			vista.addObject("productosUsuario", usuario.getProductos());
		}
		
        
		return vista;
	}
	
	@RequestMapping(value="/carrito/addProductos",method = RequestMethod.POST)
	public String registrarProducto(@Valid ProductosForm productos, BindingResult result) {
		
		UsuarioWeb usuarioWeb = UserSessionHelper.getUserSession();
		
		if(eXiquetsConstants.USUARIO_TIPO_ANONIMO.equalsIgnoreCase(usuarioWeb.getTipoUsuario())){
		    Usuariosanonimo usuario = usuarioWeb.getUsuarioAnonimo();
			for(ProductoForm productoForm : productos.getProductos()){
				if(productoForm.isSeleccionado()){
					for(Producto p : gestorProductos.getProductos()){
						if(productoForm.getIdProductos() == p.getIdProductos()){
							if(!usuario.hasProducto(p)){						
								p.getUsuariosanonimos().add(usuario);
								gestorProductos.updateProductos(p);
//								usuario.getProductos().add(p);
//								gestorUsuarios.updateUsuarioAnonimo(usuario);
							}
						}
					}
		    	}
		    }
		}else{
			User usuario = usuarioWeb.getUsuarioRegistrado();
			
			for(ProductoForm productoForm : productos.getProductos()){
				if(productoForm.isSeleccionado()){
					for(Producto p : gestorProductos.getProductos()){
						if(productoForm.getIdProductos() == p.getIdProductos()){
							if(!usuario.hasProducto(p)){
								p.getUsers().add(usuario);
								gestorProductos.updateProductos(p);
//								usuario.getProductos().add(p);
//								gestorUsuarios.updateUsuario(usuario);
							}
						}
					}
		    	}
		    }
		}		
		

		
		return "redirect:/carrito/addProductos";
 
	}
	
}